package com.niuwa.p2p.service.customer;

import java.util.List;
import java.util.Map;

import com.niuwa.p2p.core.mvc.entity.PageBean;
import com.niuwa.p2p.entity.Dictionary;
import com.niuwa.p2p.entity.customer.CustLoginLog;
import com.niuwa.p2p.entity.customer.CustPwdReset;
import com.niuwa.p2p.entity.customer.Customer;
import com.niuwa.p2p.vo.customer.BaseCustomerInfoVo;
import com.niuwa.p2p.vo.customer.BaseInvestVo;
import com.niuwa.p2p.vo.customer.BaseLoanVo;
import com.niuwa.p2p.vo.customer.CustomerAuditVo;
import com.niuwa.p2p.vo.customer.CustomerVo;
import com.niuwa.p2p.vo.front.account.CustomerInformation;

public interface ICustomerService {

	/**
	 * 分页查询客户集合 根据paramMap，选取需要的客户集合
	 * 
	 * @param paramMap
	 *            过滤得条件Map
	 * @return PageBean<CustomerVo> 分页信息与分页数据集合（用户集合）
	 */
	public PageBean<CustomerVo> search(Map<String, Object> paramMap);

	/**
	 * 锁定客户 锁定对象:状态为正常的客户 限制优先级如下: 注销>禁用>锁定>正常
	 * 
	 * @param custId
	 *            客户ID
	 * @return 更新条数
	 * @throws 锁定失败
	 *             (更新DB失败)
	 */
	public int updateCustomerToFroze(long custId, long applyUserId) throws Exception;

	/**
	 * 解锁客户 解锁对象:状态为锁定的客户 只有当客户为锁定状态,才能解锁. 解锁后,客户状态变更为正常.
	 * 
	 * @param custId
	 *            客户ID
	 * @return 更新条数
	 * @throws 解锁失败
	 *             (更新DB失败)
	 */
	public int updateCustomerToUnfroze(long custId, long applyUserId) throws Exception;

	/**
	 * 禁用客户 禁用对象:状态为正常,锁定的客户 限制优先级如下: 注销>禁用>锁定>正常
	 * 
	 * @param custId
	 *            客户ID
	 * @return 更新条数
	 * @throws 禁用失败
	 *             (更新DB失败)
	 */
	public int updateCustomerToDisable(long custId, long applyUserId) throws Exception;

	/**
	 * 启用客户 启用对象:状态为禁用的客户 只有当客户为禁用状态,才能启用. 启用后,客户状态变更为正常.
	 * 
	 * @param custId
	 *            客户ID
	 * @return 更新条数
	 * @throws 锁定失败
	 *             (更新DB失败)
	 */
	public int updateCustomerToEnable(long custId, long applyUserId) throws Exception;

	/**
	 * 注销客户 注销对象:状态为正常,锁定,禁用的客户 限制优先级如下: 注销>禁用>锁定>正常
	 * 
	 * @param custId
	 *            客户ID
	 * @param writeOffReasonCust
	 *            注销原因
	 * @param uploadedFileNameCust
	 *            上传文件名
	 * @return 更新条数
	 * @throws 注销失败
	 *             (更新DB失败)
	 */
	public int updateCustomerToWriteOff(long custId, String writeOffReasonCust,
			String uploadedFileIdCust, long applyUserId) throws Exception;

	/**
	 * 锁定账户 锁定对象:状态为正常的账户 限制优先级如下: 注销>禁用>锁定>正常
	 * 
	 * @param custId
	 *            账户ID
	 * @return 更新条数
	 * @throws 锁定失败
	 *             (更新DB失败)
	 */
	public int updateToAccountForze(long custId, long applyUserId) throws Exception;

	/**
	 * 解锁账户 解锁对象:状态为锁定的账户 只有当账户为锁定状态,才能解锁. 解锁后,账户状态变更为正常.
	 * 
	 * @param custId
	 *            账户ID
	 * @return 更新条数
	 * @throws 解锁失败
	 *             (更新DB失败)
	 */
	public int updateAccountToUnfroze(long custId, long applyUserId) throws Exception;

	/**
	 * 禁用账户 禁用对象:状态为正常,锁定的账户 限制优先级如下: 注销>禁用>锁定>正常
	 * 
	 * @param custId
	 *            账户ID
	 * @return 更新条数
	 * @throws 禁用失败
	 *             (更新DB失败)
	 */
	public int updateAccountToDisable(long custId, long applyUserId) throws Exception;

	/**
	 * 启用账户 启用对象:状态为禁用的账户 只有当账户为禁用状态,才能启用. 启用后,账户状态变更为正常.
	 * 
	 * @param custId
	 *            账户ID
	 * @return 更新条数
	 * @throws 锁定失败
	 *             (更新DB失败)
	 */
	public int updateAccountToEnable(long custId, long applyUserId) throws Exception;

	/**
	 * 注销账户 注销对象:状态为正常,锁定,禁用的账户 限制优先级如下: 注销>禁用>锁定>正常
	 * 
	 * @param custId
	 *            账户ID
	 * @param writeOffReasonAccount
	 *            注销原因
	 * @param uploadedFileNameAccount
	 *            上传文件名
	 * @return 更新条数
	 * @throws 注销失败
	 *             (更新DB失败)
	 */
	public int updateAccountToWriteOff(long custId,
			String writeOffReasonAccount, String uploadedFileIdAccount, long applyUserId)
			throws Exception;

	/**
	 * 投资列表
	 * 
	 * @return
	 */
	public PageBean<BaseInvestVo> selectInvest(Map<String, Object> paramMap);

	/**
	 * 借款列表
	 * 
	 * @return
	 */
	public PageBean<BaseLoanVo> selectLoanList(Map<String, Object> paramMap);

	/**
	 * 审核列表
	 * 
	 * @return
	 */
	public PageBean<CustomerAuditVo> selectCustomerAuditList(
			Map<String, Object> paramMap);

	/**
	 * 注销 1.注销平台账号 2.注销资金账号
	 * 
	 * @param custId
	 * @return
	 * @throws Exception
	 */
	public int updatePlatOrAccountStatusOff(CustomerAuditVo auditVo)
			throws Exception;

	/**
	 * 更新审核状态(通过)
	 * 
	 * @param auditVo
	 * @return
	 * @throws Exception
	 */
	public int updatePassAuditInfo(CustomerAuditVo auditVo) throws Exception;

	/**
	 * 更新审核状态(拒绝)
	 * 
	 * @param auditVo
	 * @return
	 * @throws Exception
	 */
	public int updateRefusedAuditInfo(CustomerAuditVo auditVo) throws Exception;

	/**
	 * 根据客户号获取客户信息 <br>
	 * 
	 * by zhangbo at 2015/2/13
	 * 
	 * @param id
	 * @return Customer
	 */
	public Customer getCustomerById(Long id);
	
	
	/**
	* @Description: 根据客户登录名获取客户信息 
	* by bwz at 2015年4月5日
	* @param loginName
	* @return
	*/
	public Customer getCustomerByLoginName(String loginName) throws Exception;
	
	
	/**
	 * @Description: 查询用户投资信息
	 * by bwz at 2015年4月8日
	 * @param customerId
	 * @return
	 */
	public BaseInvestVo selectUserInvestInfo(long customerId);
	

	/**
	 * @param paramMap
	 * @return
	 */
	public PageBean<BaseCustomerInfoVo> searchRegUsersList(Map<String, Object> paramMap);
	

	/**
	 * 根据用户信息相关字典【web】
	 * @return
	 */
	public Map<String, List<Dictionary>> getPersonalInformationDict() throws Exception;
	
	/**
	 * 获取用户认证信息【web】
	 * @param id
	 * @return
	 * @throws Exception
	 */
	public CustomerInformation getCustomerAuth(long id)throws Exception;
	
	/**
	 * 修改密码【web】
	 * @param paramMap
	 * @return
	 */
	public int updatePassWrod(Map<String, Object> paramMap);
	
	/**
	 * 更新客户[web] 
	 * @param user 更新的客户 对象
	 * @throws Exception
	 */
	public int updateByCustSelective(Customer customer) throws Exception;
	
	/**
	 * 通过登录密码、身份证号、安全保护问题、问题答案获取用户 [web安全管理]
	 * @param paramMap
	 * @return
	 */
	public Customer getCustomerBySelective(Map<String, Object> paramMap);
	
	/**
	 * @param paramMap
	 * @return
	 */
	public PageBean<CustLoginLog> searchLoginInfoList(Map<String, Object> paramMap);
	
	
	
	/**
	 * @param paramMap
	 * @return
	 */
	public PageBean<CustPwdReset> searchPasswordResetList(Map<String, Object> paramMap);
	

	/**
	 * 通过Id，手机号查询用户 [开通资金账户前的判断]
	 * @param param
	 * @return
	 */
	public Map<String, Object> findCustomerByIdAndMobile(Map<String, Object> paramMap);
	
	/**
	 * 通过邮箱获取用户
	 * @param email
	 * @return
	 */
	public Customer selectByEmail(String email);
}
